package com.example.qt.ptplatform.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.qt.ptplatform.entity.Download;
import com.example.qt.ptplatform.mapper.DownloadMapper;
import com.example.qt.ptplatform.entity.Torrent;
import com.example.qt.ptplatform.mapper.TorrentMapper;
import com.example.qt.ptplatform.service.DownloadService;
import com.example.qt.ptplatform.utils.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.util.List;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;


@Service
public class DownloadServiceImpl extends ServiceImpl<DownloadMapper, Download> implements DownloadService {

    @Autowired
    private TorrentMapper torrentMapper;

    @Autowired
    private DownloadMapper downloadMapper;

    @Autowired
    private CheatingDetectionServiceImpl cheatingDetectionService;

    public JsonResult downloadTorrent(Integer userId, Integer torrentId) {
        // 查询torrent表，获取种子记录
        Torrent torrent = torrentMapper.selectById(torrentId);
        if (torrent == null) {
            return JsonResult.error("找不到对应的种子文件");
        }
//
        // 2. 转换单位：GB -> Bytes
        Long torrentSizeBytes = (long) (torrent.getSizeGB() * 1024 * 1024 * 1024);

        // 3. 触发作弊检测（速率检测）
//        cheatingDetectionService.checkDownloadRate(userId, torrentSizeBytes);

        // 获取通过真实文件名来查询文件
        String realFileName = torrent.getRealFilename();  // 获取真实文件名
        if (realFileName == null || realFileName.isEmpty()) {
            return JsonResult.error("文件的真实文件名不存在");
        }

        // 获取torrent文件路径，假设文件保存在testDir目录下
        Path filePath = Paths.get("testDir", realFileName);  // 使用真实文件名来拼接文件路径

        // 获取文件大小
        File file = filePath.toFile();
        if (!file.exists()) {
            return JsonResult.error("文件不存在");
        }

        // 获取文件大小
//        long downloadSize = file.length();
        // 1. 获取sizeGB（直接使用大小，单位是GB）
        Double sizeGB = torrent.getSizeGB();
        if (sizeGB == null) {
            return JsonResult.error("种子文件的大小不存在");
        }
        Float downloadSize = sizeGB.floatValue();

        // 记录下载信息到数据库
        Download download = new Download();
        download.setTorrentId(torrentId);
        download.setUserId(userId);
        download.setDownloadTime(java.sql.Timestamp.valueOf(LocalDateTime.now()));
        download.setDownloadSize(downloadSize);
        downloadMapper.insert(download);

        // 返回成功的JSON响应
        return JsonResult.success(file);
    }


    public JsonResult getDownloadRecords(Integer userId, Integer page, Integer perPage) {
        // 计算分页的偏移量
        int offset = (page - 1) * perPage;

        // 调用 Mapper 查询方法获取带有种子文件名称的下载记录
        List<Download> result = downloadMapper.getDownloadRecordsWithTorrentTitle(userId, offset, perPage);

        // 获取总记录数
        int total = downloadMapper.countDownloadsByUserId(userId);

        // 使用 JsonResult 返回分页结果
        return JsonResult.success(result, (long) total);
    }

    // 删除下载记录
    public JsonResult deleteDownloadRecord(Integer userId, Integer downloadId) {
        // 查询该下载记录
        Download download = downloadMapper.selectById(downloadId);

        // 如果记录不存在，返回错误信息
        if (download == null) {
            return JsonResult.error("找不到对应的下载记录");
        }

        // 检查记录的 user_id 是否与传入的 user_id 匹配
        if (!download.getUserId().equals(userId)) {
            return JsonResult.error("没有权限删除其他用户的下载记录");
        }

        // 删除记录
        int rowsDeleted = downloadMapper.deleteById(downloadId);

        // 如果删除成功，返回成功信息
        if (rowsDeleted > 0) {
            return JsonResult.success("删除成功");
        } else {
            return JsonResult.error("删除失败");
        }
    }

}
